package com.leetcode;

import java.util.HashMap;

public class Leetcode036 {
    //    public boolean isValidSudoku(char[][] board) {
//        //9行，每一行一个hashMap
//        HashMap<Integer, Integer>[] rows = new HashMap[9];
//        //9列，每一列一个hashMap
//        HashMap<Integer, Integer>[] columns = new HashMap[9];
//        //9个9方格，每一个9方格一个hashMap
//        HashMap<Integer, Integer>[] blockes = new HashMap[9];
//
//        for (int i = 0; i < 9; i++) {
//            rows[i] = new HashMap<>();
//            columns[i] = new HashMap<>();
//            blockes[i] = new HashMap<>();
//        }
//
//        for (int i = 0; i < 9; i++) {
//            for (int j = 0; j < 9; j++) {
//                char ch = board[i][j];
//                //只判断数字
//                if(ch != '.'){
//                    int num = (int)ch;
//                    //换算出block的下标,i 决定上中下，j 决定左中右
//                    int block_index = (i/3)*3 + j/3;
//                    rows[i].put(num,rows[i].getOrDefault(num,0)+1);
//                    columns[j].put(num,columns[j].getOrDefault(num,0)+1);
//                    blockes[block_index].put(num,blockes[block_index].getOrDefault(num,0)+1);
//
//                    if(rows[i].get(num)>1 || columns[j].get(num)>1 || blockes[block_index].get(num)>1){
//                        return false;
//                    }
//                }
//            }
//        }
//
//        return true;
//    }
    public boolean isValidSudoku(char[][] board) {
        HashMap<Character, Integer>[] lines = new HashMap[9];
        HashMap<Character, Integer>[] columns = new HashMap[9];
        HashMap<Character, Integer>[] blocks = new HashMap[9];

        for (int i = 0; i < 9; i++) {
            lines[i] = new HashMap<>();
            columns[i] = new HashMap<>();
            blocks[i] = new HashMap<>();
        }

        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                char ch = board[i][j];
                if (ch != '.') {
                    //换算出block的下标,i 决定上中下，j 决定左中右
                    int block_index = (i / 3) * 3 + j / 3;

                    //根据下标 i,存放到对应行
                    lines[i].put(ch, lines[i].getOrDefault(ch, 0) + 1);
                    //根据下标 j,存放到对应列
                    columns[j].put(ch, columns[j].getOrDefault(ch, 0) + 1);
                    //根据下标 block_inde,存放到对应小9方格
                    blocks[block_index].put(ch, blocks[block_index].getOrDefault(ch, 0) + 1);

                    //横线，竖线，或者小9方格内重复
                    if (lines[i].get(ch) > 1 || columns[j].get(ch) > 1 || blocks[block_index].get(ch) > 1) {
                        return false;
                    }
                }
            }
        }

        return true;
    }

    public static void main(String[] args) {
        Leetcode036 leetcode036 = new Leetcode036();
        char[][] board = new char[][]{{'5', '3', '.', '.', '7', '.', '.', '.', '.'}
                , {'6', '.', '.', '1', '9', '5', '.', '.', '.'}
                , {'.', '9', '8', '.', '.', '.', '.', '6', '.'}
                , {'8', '.', '.', '.', '6', '.', '.', '.', '3'}
                , {'4', '.', '.', '8', '.', '3', '.', '.', '1'}
                , {'7', '.', '.', '.', '2', '.', '.', '.', '6'}
                , {'.', '6', '.', '.', '.', '.', '2', '8', '.'}
                , {'.', '.', '.', '4', '1', '9', '.', '.', '5'}
                , {'.', '.', '.', '.', '8', '.', '.', '7', '9'}};

        System.out.println(leetcode036.isValidSudoku(board));
    }
}
